package com.xyhy.starter.mfx.repostory;

import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryWrapper;
import com.xyhy.core.web.model.page.PageResult;
import com.xyhy.core.web.model.page.PurePageQO;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

public interface MfxRepository<T, ID> {

  T save(T record);

  T insert(T record);

  T insertSelective(T record);

  List<T> insertMultiple(List<T> records);

  boolean deleteById(ID id);

  int deleteByIdIn(Collection<ID> ids);

  int deleteByColumn(QueryColumn column, Object value);

  int deleteByColumnIn(QueryColumn column, List<? extends Object> values);

  List<T> findAll();

  List<ID> findAllId();

  List<T> findAllByIdInOrder(List<ID> ids);

  List<T> findAllById(Collection<ID> ids);

  PageResult<T> findPage(PurePageQO qo, QueryWrapper queryWrapper);

  T findValidOne(ID id);

  T findByIdOrNull(ID id);

  Optional<T> findById(ID id);

  boolean existById(ID id);

  List<ID> existByIdIn(List<ID> ids);

  boolean existByColumn(QueryColumn column, Object value);

  boolean existByColumn(QueryColumn column, Object value, ID curId);

  boolean existByColumnIn(QueryColumn column, List<? extends Object> value);

  boolean existByColumnIn(QueryColumn column, List<? extends Object> value, ID curId);

  T updateById(T record);

  T updateByIdSelective(T record);

  <DTO> boolean updateByIdPart(DTO dto);

  <DTO> boolean updateByIdPart(ID id, DTO dto);

  <R> boolean updateColumnById(ID id, QueryColumn column, R value);

  int updateColumnsNullById(ID id, QueryColumn... columns);
}
